package com.yeung.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @Order() 注解切面的优先级, 值越小, 优先级越高
 */


@Order(2)
@Aspect
@Component
public class VlidationAspect {
    /**
     * 定义一个方法, 用于声明切入点表达式,一般地, 该方法中在不需要添加其他代码
     * 其他通知只需要使用方法名来引用当前切入点表达式
     * //* 是一个通配符,表示所有方法执行之前
     *相当于这个切点适用于:
     * 所有public方法,  所有返回类型, ArtithmeticCalculator这个类中的, 任何方法(任何参数))
     */
    @Pointcut("execution(public * ArtithmeticCalculator.*(..))")
    public void declareJoinPointExpression() {

    }

    //这是一个通知的定义,  前置通知
    @Before("declareJoinPointExpression()")
    public void validateArgs(JoinPoint joinPoint) {
        System.out.println("--> validate:" + Arrays.asList(joinPoint.getArgs()));
    }
}
